package com.swinw.asumall.search.thread;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadTest {
    public static ExecutorService executorService = Executors.newFixedThreadPool(10);
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("方法开始");
        //不带返回值
//        CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> {
//            System.out.println("当前线程+" + Thread.currentThread().getId());
//            int a = 10 / 2;
//            System.out.println("执行结束 a=" + a);
//        }, executorService);
        //带返回值
//        CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
//            System.out.println("当前线程+" + Thread.currentThread().getId());
//            int a = 10 / 2;
//            System.out.println("执行结束 a=" + a);
//            return a;
//        }, executorService).whenComplete((result,exception)->{ //执行成功后的执行逻辑
//            System.out.println("异步调用成功了,结果是： " + result);
//            //虽然能得到异常信息，那么不能修改返回数据
//            System.out.println("异常信息： " + exception);
//        }).exceptionally(throwable->{//执行出异常后的执行逻辑
//            System.out.println("执行出异常了，异常信息： " + throwable);
//            //能修改返回数据
//            return 10;
//        });
//        CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
//            System.out.println("当前线程+" + Thread.currentThread().getId());
//            int a = 10 / 0;
//            System.out.println("执行结束 a=" + a);
//            return a;
//        }, executorService).handle((result,thr)->{
//            if(result != null) {
//                return result * 2;
//            }
//            if(thr != null){
//                return -1;
//            }
//            return 0;
//        });
//        System.out.println("方法结束");
//        System.out.println("执行结果+：" + completableFuture.get());

//        CompletableFuture<Void> future1 = CompletableFuture.supplyAsync(() -> {
//            System.out.println("当前线程+" + Thread.currentThread().getId());
//            int a = 10 / 2;
//            System.out.println("执行结束 a=" + a);
//            return a;
//        }, executorService).thenRunAsync(()->{
//            //执行的前提是上一个任务能正常执行完成，不能获取到上一步的执行结果
//            System.out.println("任务2开始执行了");
//        },executorService);
//        CompletableFuture.supplyAsync(() -> {
//            System.out.println("当前线程+" + Thread.currentThread().getId());
//            int a = 10 / 2;
//            System.out.println("执行结束 a=" + a);
//            return a;
//        }, executorService).thenAcceptAsync((result)->{
//            //能接收上一任务的执行结果，但是没有当前任务执行返回值
//            System.out.println("任务2启动了，任务1的返回值为 + " + result);
//        },executorService);

        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
            System.out.println("当前线程+" + Thread.currentThread().getId());
            int a = 10 / 2;
            System.out.println("执行结束 a=" + a);
            return a;
        }, executorService).thenApplyAsync((result) -> {
            System.out.println("任务2启动了，任务1的返回值为 + " + result);
            return result;
        }, executorService);
        System.out.println("任务2执行完的返回结果" + future.get());
    }
}
